home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
util
/
sys
/
Replace_37_2.lha
/
Replace
/
Src
/
Replace.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-04
|
7KB
|
368 lines
#include "Replace.h"
STXT VersTag[] = "$VER: " VSTR;
STXT CompileNo[] = "Compiled on " __DATE__ " at " __TIME__;
STXT Copyright[] = "Copyright © 1994,95 Klaus Alexander Seistrup @ Magnetic Ink";
STXT EMail[] = "E-mail: kas@mink.ping.dk";
STXT LFFmt[] = "%s\n";
CFG GlobCFG;
TEXT RBuf[RBUFSIZE];
Prototype LONG stricmp(TEXT *,TEXT *);
//
LONG
stricmp(s1,s2)
TEXT *s1,*s2;
{
return (Strnicmp(s1,s2));
}
Prototype LONG strnicmp(TEXT *,TEXT *,LONG);
//
LONG
strnicmp(s1,s2,n)
TEXT *s1,*s2;
LONG n;
{
return (Strnicmp(s1,s2,n));
}
Prototype VOID BadFile(TEXT *,TEXT *,TEXT *);
//
VOID
BadFile(pgm,typ,fil)
TEXT *pgm,*typ,*fil;
{
extern volatile int errno;
int err = errno;
fprintf(stderr,"33m%s:0m Couldn't open %sput file 3m%s0m\n",pgm,typ,fil);
fprintf(stderr,"Error %ld: %s\n",err,strerror(err));
exit(10);
}
Prototype VOID BadParm(TEXT *,TEXT *);
//
VOID
BadParm(pgm,parm)
TEXT *pgm,*parm;
{
fprintf(stderr,"33m%s:0m Mandatory 3m%s0m parameter missing!\n",pgm,parm);
exit(10);
}
Prototype VOID About(VOID);
//
VOID
About(VOID)
{
fprintf(stderr,LFFmt,VersTag+6);
fprintf(stderr,LFFmt,CompileNo);
fprintf(stderr,LFFmt,Copyright);
fprintf(stderr,LFFmt,EMail);
}
Prototype VOID Usage(TEXT *);
//
VOID
Usage(pgm)
TEXT *pgm;
{
fprintf(stderr, \
"33mUSAGE:0m 1m%s0m 2m[0m-i3minFile0m2m] [0m-o3moutFile0m2m] <0m-s3msearchStr0m2m> <0m-r3mreplaceStr0m2m> [0m-03mzeroAlias0m2m] [0m-c2m] [0m-v2m]0m\n" \
"\n" \
"\t-1mi0m Optional 3minput0m file (default: stdin)\n" \
"\t-1mo0m Optional 3moutput0m file (default: stdout)\n" \
"\t-1ms0m Mandatory 3msearch0m string\n" \
"\t-1mr0m Mandatory 3mreplace0m string\n" \
"\t-1m00m Set ASCII zero alias for search/replace (not yet implemented)\n" \
"\t-1mc0m Use case-sensitive search routine (default: case-insensitive)\n" \
"\t-1mv0m Verbose (report number of successful search/replace)\n",pgm);
}
Prototype TEXT *transmogrify(TEXT *);
//
TEXT *
transmogrify(src)
TEXT *src;
{
TEXT *dst = src;
TEXT *ptr = dst;
if (src)
{
BOOL flg = 0;
long len = 2;
while (*ptr)
{
if (*ptr == 0x5C) // BackSlash
flg = 1;
++ptr;
++len;
}
if (flg)
{
TEXT c;
dst = malloc(len);
if (dst == NULL)
{
fputs("Not enough memory!\n",stderr);
exit(20);
}
ptr = dst;
while (c = *src)
{
if (c == 0x5C)
{
TEXT *tail;
long v;
++src;
switch (*src)
{
case 0x5C:
*ptr = c;
break;
case 0x00:
--src;
break;
default:
v = strtol(src,&tail,0);
if (v == 0)
{
fputs("Conversion error - check escaped chars!\n",stderr);
exit(10);
}
*ptr = (TEXT) (v & 0x00FFL);
src = tail;
--src;
}
}
else
*ptr = c;
++src;
++ptr;
}
*ptr = 0;
}
}
return (dst);
}
Prototype CFG *InitCFG(LONG,TEXT **);
//
CFG *
InitCFG(argc,argv)
LONG argc;
TEXT **argv;
{
CFG *cfg = &GlobCFG;
TEXT *pgmName = FilePart(argv[0]);
bzero(cfg,sizeof(*cfg));
cfg->cfg_fi = stdin;
cfg->cfg_fo = stdout;
cfg->cfg_fe = freopen("Console:","w+",stderr);
if (cfg->cfg_fe)
{
int i;
if (argv[1][0] == '?')
{
Usage(pgmName);
exit(1);
}
for (i = 1 ; i < argc ; ++i)
{
TEXT *ptr = argv[i];
if (*ptr == '-')
{
ptr += 2;
switch (ToLower(ptr[-1]))
{
case 'c':
cfg->cfg_case = TRUE;
break;
case 'i':
if (*ptr)
cfg->cfg_in = ptr;
else
cfg->cfg_in = argv[++i];
break;
case 'o':
if (*ptr)
cfg->cfg_out = ptr;
else
cfg->cfg_out = argv[++i];
break;
case 'r':
if (*ptr)
cfg->cfg_replace = ptr;
else
cfg->cfg_replace = argv[++i];
break;
case 's':
if (*ptr)
cfg->cfg_search = ptr;
else
cfg->cfg_search = argv[++i];
break;
case '0':
case 'z':
case 'n': // Zero-alias not yet implemented...
break;
case 'v':
cfg->cfg_verbose = TRUE;
break;
case 'a':
About();
exit(1);
case '?':
case 'h':
Usage(pgmName);
exit(1);
default:
fprintf(cfg->cfg_fe,"33m%s:0m Unrecognized option 1m%c0m\n",pgmName,ptr[-1]);
Usage(pgmName);
exit(5);
}
}
}
if (cfg->cfg_in && cfg->cfg_out)
{
if ((Stricmp(cfg->cfg_in,cfg->cfg_out) == 0) || (Stricmp(cfg->cfg_out,"-") == 0))
{
long len = strlen(cfg->cfg_in) + 3L;
char *new = malloc(len);
if (new == NULL)
{
fprintf(cfg->cfg_fe,"33m%s:0m Insufficient memory!\n",pgmName);
exit(20);
}
sprintf(new,"%s~",cfg->cfg_in);
if (Rename(cfg->cfg_in,new) == 0)
{
(VOID) DeleteFile(new);
if (Rename(cfg->cfg_in,new) == 0)
{
fprintf(cfg->cfg_fe,"33m%s:0m Can't rename 3m%s0m as 3m%s0m!\n",pgmName,cfg->cfg_in,new);
exit(20);
}
}
cfg->cfg_out = cfg->cfg_in;
cfg->cfg_in = new;
}
}
if (cfg->cfg_in)
if ((cfg->cfg_fi = freopen(cfg->cfg_in,"r",stdin)) == NULL)
BadFile(pgmName,"in",cfg->cfg_in);
if (cfg->cfg_out)
if ((cfg->cfg_fo = freopen(cfg->cfg_out,"w",stdout)) == NULL)
BadFile(pgmName,"out",cfg->cfg_out);
if (cfg->cfg_search == NULL)
BadParm(pgmName,"search");
cfg->cfg_search = transmogrify(cfg->cfg_search);
cfg->cfg_slen = strlen(cfg->cfg_search);
if (cfg->cfg_replace == NULL)
BadParm(pgmName,"replace");
cfg->cfg_replace = transmogrify(cfg->cfg_replace);
cfg->cfg_rlen = strlen(cfg->cfg_replace);
if (cfg->cfg_case)
cfg->cfg_comp = strncmp;
else
cfg->cfg_comp = strnicmp;
return (cfg);
}
fprintf(cfg->cfg_fo,"33m%s:0m Error stream wouldn't open...\n",pgmName);
exit(20);
}
/*
** USAGE: Replace [-iinFile] [-ooutFile] <-ssearchStr> <-rreplaceStr> [-c] [-v]
*/
void
main(ac,av)
int ac;
char **av;
{
CFG *cfg = InitCFG((LONG)ac,(TEXT **)av);
LONG bsiz = RBUFSIZE-1;
TEXT *rbuf = RBuf;
TEXT *ptr;
while (ptr = fgets(rbuf,bsiz,cfg->cfg_fi))
{
int slen = strlen(ptr);
int ccnt = 0;
while (ccnt < slen)
{
if (cfg->cfg_comp(cfg->cfg_search,&ptr[ccnt],cfg->cfg_slen) != 0)
{
fputc(ptr[ccnt],cfg->cfg_fo);
++ccnt;
}
else
{
fwrite(cfg->cfg_replace,1,cfg->cfg_rlen,cfg->cfg_fo);
++(cfg->cfg_count);
ccnt += cfg->cfg_slen;
}
}
}
if (cfg->cfg_verbose)
{
if (cfg->cfg_count)
fprintf(cfg->cfg_fe,"Replaced %ld occurrances of 3m%s0m with 3m%s0m\n",cfg->cfg_count,cfg->cfg_search,cfg->cfg_replace);
else
fprintf(cfg->cfg_fe,"No matches found...\n");
}
exit(0);
}
/*
** EOF
*/